// 场景：当你在用表格时，需要一个调整行数据的顺序功能，可以把当前的行数据移动到指定的行。
// 问题：
// 1.前端还是后端排序？
// 2.如何把行1换到行3？
// 3.如何让后端把当前的排列顺序保存下来？
// 4.有分页怎么办？
// 5.有过滤条件怎么办？

// 解决方案：
// 1.前端还是后端排序？
// 因为前端排序可以即时把结果展示给用户，如果没有分页和过滤条件，我们这里建议是前端排序，然后把结果传给后端保存。
// 因为如果通过后端排序，开销大，用户体验差。

// 1.如何把行1换到行3？
//     思路：
//         1.当1换到3时，需要1和2先对调位置，再让2和3对调位置
//         2.
// 2.如何让后端把当前的排列顺序保存下来？
//     思路：
//         1.把变更过的数据传给后端
//         2.把全量数据传给后端

const arr=[
    {name:'kevin',sort:1},
    {name:'kevin1',sort:2},
    {name:'kevin2',sort:3},
    {name:'kevin3',sort:4},
    {name:'kevin4',sort:5},
]

sort(arr,1,3)

// 根据索引调整数据位置
function sort(arr,oldIndex,newIndex){
    // 数组不能为空
    if(arr.length<1){
        return
    }
    // 对换位置不能相等
    if(oldIndex===newIndex){
        return
    }
    // 不能超出数组范围
    if(!isInRange(oldIndex,arr) || !isInRange(newIndex,arr)){
        return false;
    }
    
    // 深拷贝
    const newArr=JSON.parse(JSON.stringify(arr))
    
    
    if(oldIndex<newIndex){
        // 从小换到大，从前往后换
        for (let index = oldIndex; index < newIndex; index++) {
            const nextIndex=index+1;
           swap(newArr,index,nextIndex) 
        }
    }else{
        // 从大换到小，从后往前换
        for (let index = oldIndex; index > newIndex; index--) {
            const nextIndex=index-1;
           swap(newArr,index,nextIndex) 
        }
    }
    
    console.log(newArr,newArr.length)
    return newArr;
}

// 是否在范围内
function isInRange(num,arr){
    return num>=0 && num <arr.length;
}

//对换位置
function swap(arr,oldIndex,newIndex){
    // 先把行内容对调
    const temp=arr[oldIndex]
    arr[oldIndex]=arr[newIndex]
    arr[newIndex]=temp;
    // 把sort字段更新
    const temp1=arr[oldIndex].sort
    arr[oldIndex].sort=arr[newIndex].sort
    arr[newIndex].sort=temp1;
    return arr;
}
